package com.fyl.leetcode.binarySearch;

/**
 * @author:fyl
 * @date 2021/5/12 19:53
 * @Modified By:
 * @Modified Date:
 * @Description:
 * 实现int sqrt(int x)函数。
 * 计算并返回x的平方根，其中x 是非负整数。
 * 由于返回类型是整数，结果只保留整数的部分，小数部分将被舍去。
 * 输入: 8
 * 输出: 2
 * 说明: 8 的平方根是 2.82842...,
 *      由于返回类型是整数，小数部分将被舍去。
 *
 * 一个数 x 的开方 sqrt 一定在 0 ~ x 之间，并且满足 sqrt == x / sqrt。可以利用二分查找在 0 ~ x 之间查找 sqrt。
 *
 * 对于 x = 8，它的开方是 2.82842...，最后应该返回 2 而不是 3。在循环条件为 l <= r 并且循环退出时，r 总是比 l 小 1，也就是说 h = 2，l = 3，
 * 因此最后的返回值应该为 r 而不是 l。
 */
public class MySqrt {
    public int mySqrt(int x) {
        if (x <= 1) return x;
        int left = 1;
        int right = x;
        while (left <= right) {
            int mid = left + ((right - left) >> 1);
            int sqrt = x / mid;
            if (sqrt == mid) {
                return mid;
            } else if (sqrt > mid) {
                left = mid + 1;
            }else {
                right = mid -1;
            }
        }
        return right;
    }
}
